package controllers.control;

import java.lang.reflect.Method;
import utils.ReflectionUtils;
import views.annotations.Action;
import views.components.ModificarDatos;
import views.components.NuevoRegistro;

import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.data.Item;
import com.vaadin.ui.UI;

import controllers.interfaces.IExecOption;
import dao.interfaces.IBase;

public class BaseController implements IExecOption {

	@Override
	public void exeOption(String actionName, Item item,
			JPAContainer<IBase> jpaContainer) throws Exception {

		Class<?>[] classes = new Class[] { Item.class, JPAContainer.class };

		Method method = ReflectionUtils.findMethod(this.getClass(), actionName,
				classes);

		method.invoke(this, item, jpaContainer);

	}

	/**
	 * 
	 * @param id
	 * @param args
	 * @throws
	 * @throws InstantiationException
	 */
	public void insertar(JPAContainer<IBase> jpaContainer) throws Exception {

		NuevoRegistro nuevoRegistro = new NuevoRegistro(
				jpaContainer.getEntityClass(), jpaContainer);
		UI.getCurrent().addWindow(nuevoRegistro);

	}

	/**
	 * El nom coincidira amb una opcio de la tabla
	 * 
	 * @param id
	 * @param args
	 */
	@Action(secLevel = 4)
	public void modificar(Item item, JPAContainer<IBase> jpaContainer)
			throws Exception {
		if (item.getItemProperty("id") != null) {
			ModificarDatos modificarDatos = new ModificarDatos(
					jpaContainer.getEntityClass(), item, false);

			UI.getCurrent().addWindow(modificarDatos);
		}
	}

	/**
	 * El nom coincidira amb una opcio de la tabla
	 * 
	 * @param id
	 * @param args
	 */
	@Action(secLevel = 1)
	public void vore(Item item, JPAContainer<IBase> jpaContainer)
			throws Exception {

		if (item.getItemProperty("id") != null) {
			ModificarDatos verDatos = new ModificarDatos(
					jpaContainer.getEntityClass(), item, true);
			UI.getCurrent().addWindow(verDatos);
		}
	}

	/**
	 * El nom coincidira amb una opcio de la tabla
	 * 
	 * @param id
	 * @param args
	 * @throws Exception
	 */
	@Action(secLevel = 4)
	public void borrar(Item item, JPAContainer<IBase> jpaContainer)
			throws Exception {
		if (item.getItemProperty("id") != null) {

			Object id = item.getItemProperty("id").getValue();
			jpaContainer.removeItem(id);
			UI.getCurrent().getContent().markAsDirtyRecursive();
		}
	}

	/**
	 * El nom coincidira amb una opcio de la tabla
	 * 
	 * @param id
	 * @param args
	 * @throws Exception
	 */
	@Action(secLevel = 1)
	public void seleccionar(Item item, JPAContainer<IBase> jpaContainer)
			throws Exception {

		if (item.getItemProperty("id") != null) {
			throw new Exception("per implementar");
		}
	}

	/**
	 * El nom coincidira amb una opcio de la tabla
	 * 
	 * @param id
	 * @param args
	 * @throws Exception
	 */
	@Action(secLevel = 3)
	public void copiar(Item item, JPAContainer<IBase> jpaContainer)
			throws Exception {

		if (item.getItemProperty("id") != null) {
			throw new Exception("per implementar");
		}
	}

}
